#pragma once
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <memory>
#include <functional>
#include <vector>
#include "log.hpp"
#include "addr.hpp"
using namespace std;

class Route
{

private:
  bool is_exit(inetaddr ir){
     for(int i=0;i<_peers.size();i++){
        if(_peers[i]==ir) return 1;
     }
     return 0;
  }
   void addpeer(inetaddr ir){
         _peers.push_back(ir);
         use_log(loglevel::DEBUG)<<"成功添加一个用户："<<ir.get_userinfo();
   }
   void deletepeer(inetaddr ir){
      for(auto iter=_peers.begin();iter!=_peers.end();iter++ ){
        if(*iter==ir){
             _peers.erase(iter);
             use_log(loglevel::DEBUG)<<"成功删除一个用户："<<ir.get_userinfo();}
               iter=_peers.end()-1;//迭代器失效 再使用会coredump
              // break ;
      }
   }
public:
    Route() {}
    
    void messroute(int sockfd,string mess,inetaddr ir){
        mutexguard md(_m);//多线程互斥；vector是共享的；stl不是线程安全的
        if(!is_exit(ir)) addpeer(ir);
           string ans=" ["+ir.get_userinfo()+"] say: "+mess;
        for(auto&peer:_peers){
            int  so=sendto(sockfd,ans.c_str(),ans.size(),0,(sockaddr *)&(ir.sockaddr()),sizeof(ir.sockaddr()));
            if (so < 0) use_log(loglevel::DEBUG) << "sendto failure!";
        }
        if(mess=="QUIT") {
            deletepeer(ir);    
        }
    }
      

    ~Route() {}

private:
    vector<inetaddr> _peers;
    mutex _m;
};